# _*_coding:utf-8_*_
#版本更新1：实现循环判断，思路先加一个死循环while1，可以实现不断输入，再加一个if。选中代码 统一进行缩进
#版本更新2：输入错误给与提示该如何输入，且实现对格式的控制
#版本更新3：对未包含的所有其他字符予以通过
#版本更新4(重构1)：对代码进行重构，使之变为pythonic (更多的使用python库中的函数),让它更精致，使用string库
#版本更新5(重构2)：去掉一些注释，去掉常量定义,直接使用string库中的函数
#版本更新6(重构3)： 使用二进制 置位 按位与 按位或
#版本更新7(重构4)：删除注释
import string

while 1:


    #TODO:用户输入密码
    user_password = input('请输入密码:')

    #TODO：判断密码的合法性(只是判断)

    password_state = 0b00000    #下边有5个条件，所以设置5个0.

    #遍历各个条件
    for char in user_password:
        if char in string.ascii_uppercase:
            password_state = password_state | 0b10000     #表明第一个条件成立
            #have_upper = True
        elif char in string.ascii_lowercase:
            password_state |= 0b01000  # 表明第二个条件成立     #可以简写成 |=
            have_lower = True
        elif char in string.digits:
            password_state |= 0b00100  # 表明第三个条件成立
            have_digit = True
        else:
            password_state |= 0b00010  # 表明第四个条件成立
            have_punctuation = True     #都不满足，则为其它字符
    if len(user_password) >= 8:            #这是一个判断语句，结果输出是 True or False
        password_state |= 0b00001  # 表明第五个条件成立

    #todo:输出结果

    if password_state == 0b11111:
        print('密码符合要求！')
        break
    else:
        tishi = '密码不符合要求，'
        if password_state & 0b00001 == 0:     #( 取 password_state 的最后一位 看看是不是等于 0b00001)
            tishi = tishi + '长度不足8，'
        if password_state & 0b10000 == 0:
            tishi = tishi + '没有包含大写字符，'
        if password_state & 0b01000 == 0:
            tishi += '没有包含小写字符，'     # += 的快捷方式 -= 的快捷方式
        if password_state & 0b00100 == 0:
            tishi += '没有包含数字，'
        if password_state & 0b00010 == 0:
            tishi += '没有包含标点,'

        tishi = tishi[:-1]       #去掉最后的逗号

        print(tishi)






